#include "bq.hpp"

using namespace std;


BlockQueue* bq=new BlockQueue(10000);//创建任务队列，任务10000个
pthread_mutex_t c_lock;//消费者组内竞争锁
pthread_mutex_t p_lock;//生产者组内竞争锁
void* con_run(void* arg)
{
    char* id=(char*)arg;
      while(1)
      {
            
        pthread_mutex_lock(&c_lock);//每次先保证一个消费者进入，然后这个消费者再和生产者去竞争
        
        Task ret;
        
        bq->Get(ret);//消费者完成计算
        
        printf("消费者%s完成任务,%d+%d=%d\n",id,ret._x,ret._y,ret.sum());
        
        pthread_mutex_unlock(&c_lock);
                              
      }

}

void* pro_run(void* arg)
{
    char* id=(char*)arg;
      while(1)
      {
        
        pthread_mutex_lock(&p_lock);//这里保证仅有一个生产者进入，然后这个生产者再和消费者进行竞争
        
        int x=rand()%10000+1;
        
        int y=rand()%10000+1;
        
        Task task(x,y);//生产者产生任务
        
        bq->Push(task);
        
        printf("生产者%s派发任务：%d+%d=?\n",id,task._x,task._y);
        
        pthread_mutex_unlock(&p_lock);
                                      
      }

}


int main()
{
    
  pthread_mutex_init(&c_lock,nullptr);
  
  pthread_mutex_init(&p_lock,nullptr);
  
  pthread_t con1,con2,pro1,pro2,pro3,pro4;//创建消费者和生产者线程
  
  pthread_create(&con1,nullptr,con_run,(void*)"1号");
  
  pthread_create(&con2,nullptr,con_run,(void*)"2号");
  
  pthread_create(&pro1,nullptr,pro_run,(void*)"1号");
  
  pthread_create(&pro2,nullptr,pro_run,(void*)"2号");
  
  pthread_create(&pro3,nullptr,pro_run,(void*)"2号");
  
  pthread_create(&pro4,nullptr,pro_run,(void*)"2号");


  
  pthread_join(con1,nullptr);
  
  pthread_join(con2,nullptr);
  
  pthread_join(pro1,nullptr);
  
  pthread_join(pro2,nullptr);
  
  pthread_join(pro3,nullptr);
  
  
  pthread_join(pro4,nullptr);
  
  pthread_mutex_destroy(&p_lock);
  
  pthread_mutex_destroy(&c_lock);


  
  delete bq;
  
  return 0;


}


